package com.zjsru.oneDay202210;

import java.util.Arrays;

/**
 * @Author: CookLee
 * @Date: 2022/10/11
 * 仅执行一次字符串交换能否使两个字符串相等
 * 对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等，返回 true ；否则，返回 false 。
 *
 * 输入：s1 = "bank", s2 = "kanb"
 * 输出：true
 * 解释：例如，交换 s2 中的第一个和最后一个字符可以得到 "bank"
 *
 * 输入：s1 = "kelb", s2 = "kelb"
 * 输出：true
 * 解释：两个字符串已经相等，所以不需要进行字符串交换
 *
 * 输入：s1 = "abcd", s2 = "dcba"
 * 输出：false
 */
public class AreAlmostEqual {
    
    /**
     * 模拟排除各种情况后，判断交换次数小于2即可
     */
    public boolean areAlmostEqual(String s1, String s2) {
        int len = s1.length();
        int cnt = 0;
        if (s1.length() != s2.length()) {
            return false;
        }
        int[] nums1 = new int[101];
        for (char c : s1.toCharArray()) {
            nums1[c - 'a']++;
        }
        int[] nums2 = new int[101];
        for (char c : s2.toCharArray()) {
            nums2[c - 'a']++;
        }
        if (!Arrays.equals(nums1, nums2)) {
            return false;
        }
        for (int i = 0; i < len; i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                cnt++;
            }
        }
        return cnt <= 2;
    }
    
    /**
     * 模拟
     */
    public boolean areAlmostEqual2(String s1, String s2) {
        int len = s1.length(), a = -1, b = -1;
        for (int i = 0; i < len; i++) {
            if (s1.charAt(i) == s2.charAt(i)) {
                continue;
            }
            if (a == -1) {
                a = i;
            } else if (b == -1) {
                b = i;
            } else {
                //走到此步骤时表明 交换的次数已经超过2次（即对换次数一次）
                return false;
            }
        }
        // a = -1时 说明没有交换两个值相等
        if (a == -1) {
            return true;
        }
        //b = -1时 说明 只交换过一次，说明字符串字符不对等
        if (b == -1) {
            return false;
        }
        return s1.charAt(a) == s2.charAt(b) && s1.charAt(b) == s2.charAt(a);
    }
    
    public static void main(String[] args) {
        AreAlmostEqual areAlmostEqual = new AreAlmostEqual();
        String s1 = "aa";
        String s2 = "ac";
        System.out.println(areAlmostEqual.areAlmostEqual(s1, s2));
    }
}
